import asyncio
import time
from functools import partial


# 多协程-协程的回调

# 吃饭任务
async def eat(name: str):
    for i in range(6):
        print(f'{name}正在吃东西...')
        await asyncio.sleep(0)
    return f'{name}正在吃东西...'


# 做作业任务
async def work(name: str):
    for i in range(6):
        print(f'{name}正在学习...')
        await asyncio.sleep(0)
    return f'{name}正在学习...'

    # 定义一个回调函数，异步任务函数执行完之后回调这个歌函数


def my_call_back(coro, current_time):
    """
    这个就是协程的异步任务完成之后，自动调用的函数
    :param coro:  当前完成任务的协程对象，不需要手动传输参数
    :param current_time:  当前时间，需要手动传输的参数
    :return:
    """
    print(f'收到了一个参数{current_time}')
    print(f'当前协程的返回值是:{coro.result()}， 协程结束的时间{current_time}')


# 定义一个异步函数入口
async def main():
    task1 = asyncio.create_task(eat('张三'), name='task1')
    task2 = asyncio.create_task(work('张三'), name='task2')
    task1.add_done_callback(partial(my_call_back, current_time=time.strftime('%H:%M:%S')))

    # result = await asyncio.gather(task1, task2)
    # 得到更加详细的返回信息
    result = await asyncio.wait([task1, task2])
    print(result)  # ['张三正在吃东西...', '张三正在学习...']


if __name__ == '__main__':
    start = time.time()
    # 如下调用异步函数（协程）是其实是同步的
    # asyncio.run(eat())
    # asyncio.run(work())

    # 异步函数统一入口
    asyncio.run(main())
    print(f'耗时为:{time.time() - start}')
